  // 购物车页面
  // 主逻辑：已cart数据为核心，通过cart数据更新，再执行渲染操作，实现界面更新

  // =引入封装的三个函数+解决报错的包
  import {getSetting,chooseAddress,openSetting,showModal,showToast} from "../../utils/asyncWx.js";
  import regeneratorRuntime from '../../lib/runtime/runtime';

Page({


  /**
   * 页面的初始数据
   */
  data: {
    //===页面载入时，显示获取地址还是地址信息-存储缓存数据的变量
    address:{},
    // ====缓存中的商品信息，存到App中
    cart:[],
    // ====全选状态
    allChecked:false,
    // ====总价格、总数量，在标签需要显示的
    totalPrice:0,
    totalNum:0

  },

  onShow(){
    // =功能2：页面载入时，显示获取地址还是地址信息
    // ====获取缓存信息，将其拿给程序内存.注意这里用let 不能用const
    // ====let定义的变量值可以更改；const定义的变量后续值无法更改
    let address = wx.getStorageSync("address");
    // ==== address 为空时，无法新增属性，会报错，这里增加一个判断，解决报错问题
    if (Object.keys(address).length !== 0) {
       address.all = address.provinceName+address.cityName+address.countryName+address.detailInfo;
      };
    this.setData({
      address
    });
    // = 功能3：购物车内商品信息渲染
    // ==== 获取缓存中的购物车数据,缓存为空时，指定数据格式
    const cart =wx.getStorageSync("cart")||[];
    // ====调用公用函数，根据最新的cart数据，更新页面数据
    this.setCart(cart)
  },

  // =点击获取收货地址，后的事件处理
    // ====逻辑：获取权限状态》没权限》先引导开启权限》正常获取地址
    // ====注意：2021年小程序更新后，权限一直有，不需要再授权了！
  async handleChooseAddress(){

    try{
      // = 使用async的写法
      // ==获取权限状态
      const res1 = await getSetting();
      const scopeAddress = res1.authSetting["scope.address"];
      
      // ==判断 权限状态
      if(scopeAddress===false){
        await openSetting();
      }
      // ==判断语句正常执行后，都会进行如下的地址获取，将其拿出来，作为公共代码
      const address = await chooseAddress();
      // ==地址存入缓存区，方便后续使用
      wx.setStorageSync("address", address);

    }catch(err){
      console.log(err);
    }
  },

  // =复选框，点击的选中/取消选中事件的处理
  handelItemChange(e){
    const goods_id = e.currentTarget.dataset.id;
    // ==== 获取this。data中的cart数组；等价于 let cart = this.data.cart
    let {cart}=this.data;
    // ==== 找到操作的商品;v代表数组中的每一个元素
    let index = cart.findIndex(v=>v.goods_id===goods_id);
    // ==== 选中状态取反
    cart[index].checked=!cart[index].checked;
    // ====调用购物车更新函数，更新购物车状态；
    this.setCart(cart);
    
  },

  // =设置购物车状态，公用函数。作用：将更新后的cart数组保存到data和内存，以使页面保持最新
  setCart(cart){
    // ===需要更新的状态：全选、总价、商品总数
    let allChecked =true;
    let totalPrice=0;
    let totalNum=0;
    cart.forEach(v => {
      if(v.checked){
        totalPrice+=v.num*v.goods_price;
        totalNum+=v.num;
      }else{
        allChecked =false;
      }
    });
    allChecked = cart.length?allChecked:false;

    this.setData({
      cart,
      allChecked,
      totalNum,
      totalPrice
    });

    wx.setStorageSync("cart",cart);
    
  },

  // =全选和反选功能
  handleItemAllCheck(){
    let {cart,allChecked}=this.data;
    // ====这里的allChecked不需要设置回data，因为setCart实现了根据最新传入的cart数据更新data、内存数据的作用
    allChecked=!allChecked;
    cart.forEach(v=>v.checked=allChecked);
    // ====使用公用函数setCart，通过改变data、内存数据，重新渲染界面；
    this.setCart(cart);
  },

  // =商品数量编辑功能（1、获取操作-1/1和goods_id;
  // =2、获取cart，遍历找到对应商品，并改变他的数量；3、将cart更新，重新渲染
  async handleItemNumEdit(e){  
    // ====使用结构的方式，获取传递过来的参数
    let {id,operation} = e.target.dataset;
    let {cart}=this.data;
    const index = cart.findIndex(v=>v.goods_id===id);
    // ===增加功能，防止出现商品是负数的情况，用弹窗确认是否删除商品来代替
    if(cart[index].num===1 && operation===-1){
      const res = await showModal({content:"您是否要删除该商品？"})
      if (res.confirm) {
        cart.splice(index,1);
        this.setCart(cart);
      } 
    }else{
      cart[index].num += operation;
      this.setCart(cart);
    }
  },

  // =结算功能实现，逻辑如下：判断收货地址是否为空-判断是否选购商品-进入结算页面
  async handlePay(){
    const {address,totalNum}=this.data;
    if(!address.userName){
      await showToast({title:"您还没有选择地址！"});
      return;
    }
    if(totalNum===0){
      await showToast({title:"您还没有选购商品！"});
      return;
    }
    wx.navigateTo({
      url: '/pages/pay/index',
    });

  }

})